package com.stream;

import org.springframework.beans.factory.annotation.Autowired;

import java.util.function.Consumer;

/**
 * @Description static、default、函数式接口的demo
 * @Auther dasouche-data
 * @Date 2022/10/2611:12 AM
 */
public class FunctionalInterfaceTest {
    public static void main(String[] args) {
        int int1 = test2.getInt1();
        System.out.println("static:" + int1);
        //int anInterface = new FunctionalInterfaceTest().getInterface(23);
        //System.out.println(anInterface);

        String text = "试试自定义函数好使不";
        printString(text, System.out::print);


    }

    private static void printString(String text, test3 test3) {
        test3.print(text);
    }


    @Autowired
    private test1 test1;

    public int getInterface(int i) {
        return test1.getInt2();
    }

}


/**
 * 所谓函数式接口，是指只有一个抽象方法的接口，函数式接口适用于函数式编程的场景，lambda就是Java中函数式编程的体现；
 * 2.1另外JDK8也提供了一个注解，帮助我们编译时检查语法是否符合@FunctionInterface
 *
 * @FunctionInterface: 使用该注解来定义接口，编译器会强制检查该接口是否确实有且仅有一个抽象方法，否则会报错；
 */
@FunctionalInterface
interface test1 extends test2 {
    int getInt(int i);
    //int getInt3();
}

@FunctionalInterface
interface test3 {
    void print(String s);
}

/**
 * static方法和default方法
 * static:jdk8新增一项功能，在接口中定义一个或多个static方法，用法和普通static方法一样；
 * 实现接口的类或者子接口不会继承接口中的静态方法
 * default：jdk8新增default方法，是为了在现有类库中新增功能而不影响他们的实现类；
 * 如果定义了default实现的话，那么实现类直接调用就可以；
 * 如果接口中的默认方法不能满足某个实现类需要，那么实现类可以覆盖默认方法，不用加default关键字;
 */
interface test2 {
    int getInt(int i);

    static int getInt1() {
        return 0;
    }

    default int getInt2() {
        return 2;
    }


}


/**
 * 常用函数的demo:java.util.function包中；
 * todo 待深入理解：java的函数式接口的应用场景
 */
class CommonFunctions {
    public static void main(String[] args) {
        Consumer<String> consumer = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println("90");
            }
        };
        Consumer<String> consumer1 = s -> System.out.println("91");
        Consumer<String> consumer2 = System.out::println;
        consumer2.accept("hello function");

        Consumer<String> consumer3 = s -> System.out.print("车名：" + s.split(",")[0]);
        Consumer<String> consumer4 = s -> System.out.print("-->颜色：" + s.split(",")[1]);
        String[] strings = {"保时捷,白色", "法拉利,红色"};
        for (String string : strings) {
            consumer3.andThen(consumer4).accept(string);
        }
    }
}